//
//  UITextView+Extension.swift
//  swift-新浪微博0
//
//  Created by 赵玉忠 on 16/9/13.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

extension UITextView {
    
    var emoticonText: String? {
        get {
            var result = String()
            // 1. 遍历富文本
            self.attributedText.enumerateAttributes(in: NSMakeRange(0,  self.attributedText.length), options: []) { (dict, range, _) in
                print(dict)
                if let attachment = dict["NSAttachment"] as? HMTextAttachment {
                    // 表情图片
                    print(attachment.chs)
                    result += attachment.chs!
                }else{
                    // 进入到这个位置代表是文字
                    result += (self.attributedText.string as NSString).substring(with: range)
                }
            }
            return result
        }
    }

    
    /// 添加表情到textView中
    ///
    /// - parameter emoticon: <#emoticon description#>
    func inserEmoticon(emoticon: HMEmoticon) {
        if emoticon.type == 1 {
            // emoji表情
            self.insertText((emoticon.code! as NSString).emoji())
        }else{
            // 图片表情添加到表情模型里面
            // 1. 先将取到表情的图片名字初始化一个UIImage
            // 取到表情图片所在bundle
            let bundle = HMEmoticonKeyboardViewModel.sharedViewModel.emoticonBundel
            let image = UIImage(named: "\(emoticon.path!)/\(emoticon.png!)", in: bundle, compatibleWith: nil)
            
            // 2. 将第1步生成的图片设置到一个初始化好的`文字附件(NSTextAttachment)`
            let attachment = HMTextAttachment()
            // 给attachment赋值一个表情的字符串
            attachment.chs = emoticon.chs

            // 2.1 设置图片的大小
            let imageWH = self.font!.lineHeight
            attachment.bounds = CGRect(x: 0, y: -4, width: imageWH, height: imageWH)
            // 2.2 设置图片
            attachment.image = image
            
            // 3. 将第2步的文字附件添加到现有的文字(富文本)中
            let attr = NSMutableAttributedString(attributedString: self.attributedText)
            // attr.append(NSAttributedString(attachment: attachment))
            // 3.1 获取到光标的位置
            var selectedRange = self.selectedRange
            // 3.2 将数据插入指定光标的位置
            // attr.insert(NSAttributedString(attachment: attachment), at: selectedRange.location)
            // 将指定范围的数据替换成我们传入的数据
            attr.replaceCharacters(in: selectedRange, with: NSAttributedString(attachment: attachment))
            // 这一句代码代表设置富文本的字体大小
            attr.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, attr.length))
            
            // 4. 将添加完成的富文本，重新赋值到textView中
            self.attributedText = attr
            // 5. 重新将光标的位置调整回来
            selectedRange.location += 1
            selectedRange.length = 0
            self.selectedRange = selectedRange
            
            // 发送一个文字改变的通知
            NotificationCenter.default.post(name: NSNotification.Name.UITextViewTextDidChange, object: self, userInfo: nil)
            // 再调用一下代理方法
            delegate?.textViewDidChange?(self)
        }
    }
    
}

